package test;

import java.util.LinkedList;
import java.util.Scanner;

/**
 * @author sunzhuokun
 * @date 15:33 2024/5/13
 * @description 求满足条件的最长子串的长度
 * 给定一个字符串，只包含字母和数字，按要求找出字符串中的最长(连续)子串的长度，字符串本身是其最长的子串，子串要求:
 * <p>
 * 1、只包含 1 个字母(a~z,A~Z)，其余必须是数字:
 * <p>
 * 2、字母可以在子串中的任意位置;
 * <p>
 * 如果找不到满足要求的子串，如全是字母或全是数字，则返回-1。
 * <p>
 * 输入描述
 * <p>
 * 字符串(只包含字母和数字)
 * <p>
 * 输出描述
 * <p>
 * 子串的长度
 * <p>
 * <p>
 * 此题可以用滑动窗口求解
 * 滑动窗口的左指针开始指向索引 0，右指针也是从索引 0 开始不断向右移动，当右指针遇到字母时，则滑动窗口内部含字母量+1。
 */
public class LongestSubstring_最长子串的长度 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        System.out.println(getLongestSubstringLength(str));
    }

    private static int getLongestSubstringLength(String str) {
        int maxLen = -1;
        int l = 0, r = 0;
        LinkedList<Integer> letterIdx = new LinkedList<>();
        boolean hasLetter = false;

        while (r < str.length()) {
            if (Character.isLetter(str.charAt(r))) {
                hasLetter = true;
                letterIdx.addLast(r);
                if (letterIdx.size() > 1) {
                    l = letterIdx.pop() + 1;
                    if (r == l) {
                        r += 1;
                        continue;
                    }
                }
            }
            maxLen = Math.max(maxLen, r - l + 1);
            r += 1;
        }

        if (!hasLetter) {
            return -1;
        }

        return maxLen;
    }

}
